﻿/*
SINACOR - BMF&Bovespa
Arquivo: ImportacaoNegocio.cs
Criado em: 14-jun-2010 17:47:00
Arquiteto Responsável: p-wgeneroso
*/
using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Common;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.UI.FileTransfer.Client;
using System.IO;

namespace Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter
{
    public class ImportacaoNegocio : ImportacaoExportacaoBase<IImportacaoNegocio, Model.Parameter.FiltroImportacaoNegocio>, IDisposable, IImportacaoExportacaoPresenter
    {
        #region Atributos

        private Communication.ProcessoImportacao _communicationProcessoImportacaoNegocio = null;

        #endregion

        #region Construtores

        public ImportacaoNegocio(IImportacaoNegocio view)
            : this(view, null)
        {
        }

        public ImportacaoNegocio(IImportacaoNegocio view, Model.Parameter.IFiltroImportacaoExportacao filtro)
            : base(view, filtro)
        {
            _communicationProcessoImportacaoNegocio = new Communication.ProcessoImportacao(this.Session);
            _communicationProcessoImportacaoNegocio.Aborted += new EventHandler(_communicationProcessoImportacaoNegocio_Aborted);
            _communicationProcessoImportacaoNegocio.CommunicationError += new EventHandler<CommunicationErrorEventArgs>(_communicationProcessoImportacaoNegocio_CommunicationError);
            _communicationProcessoImportacaoNegocio.ImportacaoConcluida += new Action(_communicationProcessoImportacaoNegocio_ImportacaoConcluida);
            _communicationProcessoImportacaoNegocio.ImportacaoIniciada += new Action(_communicationProcessoImportacaoNegocio_ImportacaoIniciada);
            _communicationProcessoImportacaoNegocio.ProcessamentoImportacaoIniciado += new Action(_communicationProcessoImportacaoNegocio_ProcessamentoImportacaoIniciado);
            _communicationProcessoImportacaoNegocio.ProcessStatusReceived += new EventHandler<PSE.ProcessManager.Client.Process.ProcessStatusEventArgs>(_communicationProcessoImportacaoNegocio_ProcessStatusReceived);
        }

        #endregion

        #region Event Handlers

        private void _communicationProcessoImportacaoNegocio_Aborted(object sender, EventArgs e)
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Message.ImportacaoCancelada";
                StatusProcesso.Progress = 0;
                StatusProcesso.FinalizedAt = default(DateTime);

                View.AtualizarStatus();

                View.InformarImportacaoCancelada();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        /// 
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _communicationProcessoImportacaoNegocio_CommunicationError(object sender, CommunicationErrorEventArgs e)
        {
            try
            {
                StatusProcesso.Progress = 0;
                StatusProcesso.FinalizedAt = default(DateTime);

                View.AtualizarStatus();

                View.InformarErroImportacao();

                HandleException(e.Exception);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communicationProcessoImportacaoNegocio_ImportacaoConcluida()
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.ImportacaoConcluida";
                StatusProcesso.Progress = 100;
                StatusProcesso.FinalizedAt = DateTime.Now;

                View.AtualizarStatus();

                View.InformarImportacaoConcluida();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communicationProcessoImportacaoNegocio_ProcessStatusReceived(object sender, PSE.ProcessManager.Client.Process.ProcessStatusEventArgs e)
        {
            StatusProcesso.Step = e.Status.Step;
            StatusProcesso.Progress = e.Status.Progress;

            View.AtualizarStatus();
        }

        private void _communicationProcessoImportacaoNegocio_ProcessamentoImportacaoIniciado()
        {
            try
            {
                View.DesabilitarCancelamentoProcesso();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communicationProcessoImportacaoNegocio_ImportacaoIniciada()
        {
            try
            {
                View.HabilitarCancelamentoProcesso();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        #endregion

        #region Métodos Públicos

        public void EfetuarUpdloadArquivo()
        {
            FileRepository.GetInstance().UploadFile("Bovespa.Negocio",
                                                     Filtro.NomeArquivo);
        }

        #endregion

        #region Métodos Override

        protected override void InicializarTela()
        {
            //Não utilizado na importação
            throw new NotImplementedException();
        }

        protected override void CancelarProcesso()
        {
            try
            {
                _communicationProcessoImportacaoNegocio.Abort();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        public override void Executar()
        {
            bool realizaImportacao = true;

            try
            {
                if (!_communicationProcessoImportacaoNegocio.IsProcessRunning()
                    && View.ConfirmarImportacao())
                {
                    if (Filtro.TipoArquivo == Model.Enum.TipoArquivo.NEGS
                        && (!base.Filtro.CodigoCorrespondente.HasValue
                            || base.Filtro.CodigoCorrespondente.Value == 0))
                    {
                        realizaImportacao = false;
                        View.InformarCorrespondenteObrigatorio();
                    }

                    if (realizaImportacao)
                    {
                        StatusProcesso.Progress = 0;
                        StatusProcesso.StartedAt = DateTime.Now;
                        StatusProcesso.FinalizedAt = default(DateTime);

                        StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.RealizandoUploadArquivo";
                        View.AtualizarStatus();

                        EfetuarUpdloadArquivo();

                        StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Label.IniciandoImportacao";
                        StatusProcesso.Progress = 5;

                        View.AtualizarStatus();

                        _communicationProcessoImportacaoNegocio.ImportarNegocios(base.Filtro);
                    }
                    else
                    {
                        View.FinalizarImportacao(true);
                    }
                }
                else
                {
                    View.FinalizarImportacao(true);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        #endregion

        #region IDisposable Members

        public override void Dispose()
        {
            _communicationProcessoImportacaoNegocio.Disconnect();

            base.Dispose();
        }

        #endregion

        #region IImportacaoExportacaoPresenter Members

        public new Model.Parameter.IFiltroImportacaoExportacao Filtro
        {
            get
            {
                return base.Filtro;
            }
            set
            {
                base.Filtro = (Model.Parameter.FiltroImportacaoNegocio)value;
            }
        }

        public bool IsRunning
        {
            get
            {
                if (this._communicationProcessoImportacaoNegocio != null)
                    return this._communicationProcessoImportacaoNegocio.IsProcessRunning();
                else
                    return false;
            }
        }

        #endregion
    }
}
